home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / tex / sspell14.zip / CACHE.C next >
C/C++ Source or Header  |  1992-07-18  |  5KB  |  171 lines

  1. /* **************************************************************** */
  2. /*             sspell - similar to Unix spell                       */
  3. /*                        version 1.4                               */
  4. /*                                                                  */
  5. /* Author: Maurice Castro                                           */
  6. /* Release Date:  4 Jul 1992                                         */
  7. /* Bug Reports: maurice@bruce.cs.monash.edu.au                      */
  8. /*                                                                  */
  9. /* This code has been placed by the Author into the Public Domain.  */
  10. /* The code is NOT covered by any warranty, the user of the code is */
  11. /* solely responsible for determining the fitness of the program    */
  12. /* for their purpose. No liability is accepted by the author for    */
  13. /* the direct or indirect losses incurred through the use of this   */
  14. /* program.                                                         */
  15. /*                                                                  */
  16. /* Segments of this code may be used for any purpose that the user  */
  17. /* deems appropriate. It would be polite to acknowledge the source  */
  18. /* of the code. If you modify the code and redistribute it please   */
  19. /* include a message indicating your changes and how users may      */
  20. /* contact you for support.                                         */
  21. /*                                                                  */
  22. /* The author reserves the right to issue the official version of   */
  23. /* this program. If you have useful suggestions or changes for the  */
  24. /* code, please forward them to the author so that they might be    */
  25. /* incorporated into the official version                           */
  26. /*                                                                  */
  27. /* Please forward bug reports to the author via Internet.           */
  28. /*                                                                  */
  29. /* **************************************************************** */
  30.  
  31. #include "cache.h"
  32. #include <stdio.h>
  33. #if !defined(pyr)
  34. #include <stdlib.h>
  35. #endif
  36. #include "strfn.h"
  37.  
  38. #define NOTINCACHE (0)
  39. #define INCACHE (1)
  40.  
  41. /* this provides a cache of enteries in a list format. The format is a 
  42.    move to front linked list. */
  43.  
  44. /* Author: Maurice Castro */
  45.  
  46. typedef struct liststr
  47. {
  48.    char *name;
  49.    struct liststr *next;
  50.    } LIST;
  51.  
  52. static int maxcachesize;
  53. static int incache;
  54. static LIST *list;
  55.  
  56. void initcache(size)
  57. int size;
  58. {
  59.    list = NULL;
  60.    maxcachesize = size;
  61.    incache = 0;
  62.    }
  63.  
  64. int searchcache(match, actual)
  65. char *match;
  66. char *actual;
  67.    LIST *cur;
  68.    LIST *prev;
  69.    int mtc;
  70.   
  71.    if (list == NULL) return(NOTINCACHE);
  72.  
  73.    cur = list;
  74.    prev = NULL;
  75.    mtc = 0;
  76.  
  77.    while (cur != NULL)
  78.    {
  79.       if (!stricmp(match, cur->name)) 
  80.       {
  81.          mtc = 1;
  82.          break;
  83.          }
  84.       prev = cur;
  85.       cur = cur->next;
  86.       }
  87.    if (!mtc) 
  88.       return(NOTINCACHE);
  89.    if (prev != NULL)
  90.    {
  91.       prev->next = cur->next;
  92.       cur->next = list;
  93.       list = cur;
  94.       }
  95.    strcpy(actual, cur->name);
  96.    return(INCACHE);
  97.    }
  98.  
  99. int addtocache(item)
  100. char *item;
  101. {
  102.     int i;
  103.     LIST *cur;
  104.     LIST *prev;
  105.     LIST *newel;
  106.  
  107.     /* make new element */
  108.     newel = (LIST *) malloc(sizeof(LIST));
  109.     if (newel == NULL)
  110.        return(0);
  111.     newel->name = (char *) malloc(sizeof(char)*(strlen(item)+1));
  112.     strcpy(newel->name, item);
  113.     newel->next = NULL;
  114.  
  115.     /* cache full */
  116.     if (incache >= maxcachesize)   
  117.     {
  118.        /* traverse cache */
  119.        i = 0;
  120.        cur = list;
  121.        while (i < maxcachesize)
  122.        {
  123.           prev = cur;
  124.           cur = cur->next;
  125.           i++;
  126.           }
  127.  
  128.        /* add new element */
  129.        prev->next = NULL;
  130.        newel->next = list;
  131.        list = newel;
  132.        incache = maxcachesize;
  133.  
  134.        /* fix overspill */
  135.        while (cur != NULL)
  136.        {
  137.           prev = cur;
  138.           cur = cur->next; 
  139.           free(prev->name);
  140.           free(prev);
  141.           }
  142.        return(1);
  143.        }
  144.  
  145.     /* cache not full yet */
  146.     incache++;
  147.  
  148.     if (list == NULL)
  149.     {
  150.        list = newel;
  151.        return(1);
  152.        }
  153.     newel->next = list;
  154.     list = newel;
  155.     return(1);
  156.     }
  157.  
  158. /* for debugging use only */
  159.  
  160. void printcache()
  161. {
  162.     LIST *cur;
  163.     cur = list;
  164.     while (cur != NULL)
  165.     {
  166.         printf("%s\n", cur->name);
  167.         cur = cur->next;
  168.         }
  169.     }
  170.